서블릿 컨텍스트
1. 개요
1. 개요
서블릿 컨텐스트는 자바 서블릿 기술에서 웹 애플리케이션 하나당 단 하나만 생성되는 핵심 객체이다. 이 객체는 애플리케이션 전체의 환경 정보와 공유 자원을 중앙에서 관리하는 역할을 담당한다. 웹 애플리케이션 서버에 애플리케이션이 배포되는 시점에 생성되어, 애플리케이션이 제거되거나 서버가 종료될 때까지 유지된다.
서블릿 컨텐츠의 주요 역할은 애플리케이션 전체 범위에서 공유해야 하는 데이터와 설정을 관리하는 것이다. 여기에는 모든 서블릿과 JSP 페이지가 접근할 수 있는 초기화 파라미터와 속성(Attribute)이 포함된다. 또한 웹 애플리케이션 내부의 파일 시스템 리소스나 데이터베이스 연결 풀과 같은 공통 자원에 대한 접근 경로를 제공한다.
이 객체는 javax.servlet.ServletContext 인터페이스로 정의되며, 서블릿 API의 일부이다. 개발자는 이 인터페이스를 통해 애플리케이션의 루트 디렉터리 정보를 얻거나, 서버의 정보를 확인하고, 로그 파일에 기록하는 등의 기능을 사용할 수 있다. 서블릿 컨텐스트는 개별 서블릿의 설정을 관리하는 ServletConfig 객체와 구분되는, 애플리케이션 수준의 전역 컨텍스트이다.
2. 정의와 역할
2. 정의와 역할
서블릿 컨텍스트는 자바 서블릿 기술에서 웹 애플리케이션 하나당 생성되는 하나의 객체이다. 이 객체는 애플리케이션 전체에서 공유되는 정보와 자원을 관리하는 핵심적인 역할을 담당한다. 모든 서블릿과 JSP 페이지는 동일한 서블릿 컨텍스트 객체에 접근할 수 있어, 애플리케이션 전역에 걸쳐 데이터를 공유하거나 설정을 관리하는 데 사용된다.
서블릿 컨텍스트의 주요 역할은 애플리케이션 전체에서 공유되는 초기화 파라미터, 속성, 그리고 리소스를 저장하고 관리하는 것이다. 예를 들어, 데이터베이스 연결 정보나 애플리케이션의 공통 설정값을 초기화 파라미터로 저장하거나, 여러 사용자 세션이 공유해야 하는 카운터나 캐시 데이터를 속성으로 저장할 수 있다. 또한, 웹 애플리케이션 내의 파일이나 이미지와 같은 정적 자원에 접근하는 경로를 제공하는 기능도 수행한다.
이 객체는 웹 애플리케이션이 웹 서버나 애플리케이션 서버에 배포될 때 생성되며, 애플리케이션이 서버에서 제거되거나 서버 자체가 종료될 때 소멸된다. 이렇게 하나의 애플리케이션 생명주기와 동일하게 존재하기 때문에, 애플리케이션의 시작과 종료 시 필요한 초기화 및 정리 작업을 수행하는 데에도 활용될 수 있다.
서블릿 컨텍스트는 javax.servlet.ServletContext 인터페이스로 정의되어 있으며, 서블릿 컨테이너가 이 인터페이스의 구현체를 제공한다. 개발자는 이 인터페이스를 통해 애플리케이션의 전역 상태를 관리하고, 서버의 로그 파일에 메시지를 기록하며, 다른 웹 컴포넌트로 요청을 전달하는 등의 작업을 수행할 수 있다.
3. 생명주기
3. 생명주기
서블릿 컨텍스트의 생명주기는 웹 애플리케이션의 시작과 종료에 밀접하게 연동된다. 서블릿 컨테이너가 웹 애플리케이션을 배포하고 시작할 때, 해당 애플리케이션을 대표하는 단 하나의 서블릿 컨텍스트 객체가 생성된다. 이 시점은 보통 서버가 시작될 때나, 애플리케이션이 WAR 파일 형태로 배포될 때에 해당한다. 생성된 서블릿 컨텍스트는 애플리케이션 전체의 초기화 파라미터를 로드하고, 필요한 리소스를 준비하는 등 초기화 작업을 수행한다.
서블릿 컨텍스트는 웹 애플리케이션이 실행되는 동안 계속해서 존재하며, 애플리케이션 전체에서 공유되는 정보를 저장하는 글로벌 저장소 역할을 지속한다. 모든 서블릿과 JSP 페이지는 이 동일한 컨텍스트 객체에 접근하여 애트리뷰트를 설정하거나 조회할 수 있다. 이는 세션 범위나 요청 범위보다 훨씬 넓은, 애플리케이션 최상위의 공유 공간을 제공한다.
생명주기의 종료는 웹 애플리케이션이 서버에서 제거되거나, 서블릿 컨테이너 자체가 종료될 때 이루어진다. 이 시점에서 서블릿 컨텍스트는 소멸되며, 관리하던 모든 애트리뷰트와 리소스가 정리된다. 개발자는 서블릿 컨텍스트의 생성과 소멸 시점에 특정 로직을 실행할 수 있도록 리스너 인터페이스를 구현하여 등록할 수 있다. 이를 통해 데이터베이스 연결 풀의 초기화나 정리와 같은 애플리케이션 수준의 라이프사이클 관리를 구현한다.
4. 주요 기능
4. 주요 기능
4.1. 애트리뷰트 관리
4.1. 애트리뷰트 관리
서블릿 컨텍스트의 애트리뷰트 관리 기능은 하나의 웹 애플리케이션 내에서 여러 서블릿과 JSP 페이지가 데이터를 공유할 수 있게 해주는 핵심 메커니즘이다. 애트리뷰트는 키-값 쌍의 형태로 서블릿 컨텍스트 객체에 저장되며, 애플리케이션이 시작되어 있는 동안 모든 사용자의 모든 요청에 걸쳐 지속적으로 유효하다. 이는 특정 사용자 세션에 국한되는 세션 애트리뷰트나 단일 요청 내에서만 유효한 리퀘스트 애트리뷰트와 구분되는 전역적인 저장 공간의 성격을 가진다.
주요 사용 사례로는 애플리케이션 전체에서 공통으로 사용되는 설정 정보, 데이터베이스 연결 풀과 같은 공유 자원의 참조, 또는 사이트 방문자 수와 같은 애플리케이션 수준의 통계 데이터를 저장하는 것이 있다. 예를 들어, 웹 애플리케이션 시작 시 데이터베이스 연결을 초기화하고 그 참조를 서블릿 컨텍스트 애트리뷰트로 설정하면, 이후 모든 서블릿은 이 애트리뷰트를 통해 동일한 연결 풀에 접근할 수 있다.
애트리뷰트를 관리하기 위한 주요 메서드로는 setAttribute(String name, Object object), getAttribute(String name), removeAttribute(String name) 등이 있다. 또한 getAttributeNames() 메서드를 사용하여 저장된 모든 애트리뷰트의 이름을 열거할 수 있다. 이러한 애트리뷰트는 스레드 안전성을 고려하여 동시 접근이 발생할 수 있는 상황에 대비해 적절히 동기화 처리를 해주어야 한다.
이러한 전역 공유 특성 때문에, 서블릿 컨텍스트 애트리뷰트는 신중하게 사용되어야 한다. 과도하게 많은 데이터를 저장하거나, 빈번한 갱신이 발생하는 데이터를 저장할 경우 애플리케이션의 메모리 사용량과 성능에 부정적인 영향을 미칠 수 있으며, 스레드 세이프하지 않은 객체를 저장할 경우 데이터 무결성 문제가 발생할 위험이 있다.
4.2. 초기화 파라미터
4.2. 초기화 파라미터
서블릿 컨텍스트의 초기화 파라미터는 웹 애플리케이션 전체에 걸쳐 공통적으로 필요한 설정값을 정의하는 데 사용된다. 이 파라미터들은 애플리케이션의 배포 서술자인 web.xml 파일 내 <context-param> 요소를 통해 정적으로 선언되거나, 자바 기반 설정에서는 ServletContextInitializer를 이용해 프로그래밍 방식으로 등록할 수 있다. 이렇게 설정된 값은 애플리케이션의 모든 서블릿과 JSP 페이지에서 접근하여 사용할 수 있어, 데이터베이스 연결 정보나 시스템 경로, 애플리케이션 이름 같은 전역 구성 정보를 중앙에서 관리하는 데 유용하다.
초기화 파라미터에 접근하기 위해서는 ServletContext 객체의 getInitParameter(String name) 메서드를 사용한다. 이 메서드는 파라미터 이름에 해당하는 값을 문자열 형태로 반환한다. 또한, getInitParameterNames() 메서드를 이용하면 정의된 모든 초기화 파라미터의 이름을 열거형으로 얻을 수 있어, 동적으로 모든 설정을 순회 처리할 때 활용된다. 이 값들은 서블릿 컨텍스트가 생성되는 시점, 즉 웹 애플리케이션이 웹 서버에 배포될 때 로드되어 애플리케이션이 실행되는 동안 변경되지 않는 읽기 전용 속성이다.
초기화 파라미터는 특정 서블릿에 국한되지 않고 애플리케이션 전역에 적용된다는 점에서 ServletConfig를 통해 설정하는 서블릿 단위의 초기화 파라미터와 구별된다. 따라서 여러 서블릿이 공통으로 참조해야 하는 설정은 서블릿 컨텍스트의 초기화 파라미터로 정의하는 것이 효율적이며, 코드의 중복을 줄이고 유지보수성을 높이는 데 기여한다. 이는 웹 애플리케이션 아키텍처에서 구성 정보를 분리하는 중요한 방법 중 하나이다.
4.3. 리소스 접근
4.3. 리소스 접근
서블릿 컨텍스트는 웹 애플리케이션 내부에 위치한 다양한 리소스에 접근하기 위한 메서드를 제공한다. 이는 웹 애플리케이션의 루트 디렉토리와 그 하위 구조를 기준으로 작동하며, 서버의 실제 파일 시스템 경로를 추상화하여 접근할 수 있게 해준다.
주요 리소스 접근 메서드로는 getResource()와 getResourceAsStream()이 있다. 이 메서드들은 상대 경로를 사용하여 HTML 파일, 이미지 파일, 설정 파일 등 웹 애플리케이션 내부의 정적 또는 동적 자원을 로드하는 데 사용된다. 예를 들어, /WEB-INF/config.xml과 같은 경로를 인자로 전달하면, 서블릿 컨텍스트는 해당 웹 애플리케이션의 컨텍스트 루트를 기준으로 실제 파일을 찾아 URL 객체나 입출력 스트림으로 반환한다.
또한, getRealPath() 메서드를 사용하면 주어진 가상 경로에 해당하는 서버 파일 시스템의 절대 경로를 문자열로 얻을 수 있다. 이는 파일 업로드 처리나 서버 측에서 물리적 파일을 생성해야 할 때 유용하게 활용된다. 그러나 이 메서드는 웹 애플리케이션이 압축된 WAR 파일 형태로 배포된 경우나 특정 서버 환경에서는 null을 반환할 수 있으므로 주의가 필요하다.
이러한 리소스 접근 기능은 모든 서블릿과 JSP가 애플리케이션의 공통 자원을 일관된 방식으로 참조할 수 있도록 보장한다. 이를 통해 데이터베이스 연결 설정이나 국제화 메시지 파일과 같은 중요한 리소스를 중앙에서 관리하고 효율적으로 공유하는 것이 가능해진다.
5. ServletContext 인터페이스
5. ServletContext 인터페이스
서블릿 컨텍스트의 핵심은 javax.servlet.ServletContext 인터페이스로 정의된다. 이 인터페이스는 자바 서블릿 사양의 일부로서, 모든 서블릿 컨테이너가 구현해야 하는 표준 API를 제공한다. 개발자는 이 인터페이스를 통해 웹 애플리케이션의 전역적인 정보와 자원에 접근하고 관리할 수 있다.
ServletContext 인터페이스는 애트리뷰트 관리, 초기화 파라미터 읽기, 리소스 접근 등 주요 기능을 위한 메서드를 정의한다. 예를 들어, setAttribute()와 getAttribute() 메서드를 통해 애플리케이션 전체에서 공유할 데이터를 저장하고 조회할 수 있으며, getInitParameter() 메서드는 web.xml이나 어노테이션으로 설정한 전역 초기화 파라미터 값을 읽어온다. 또한 getResourceAsStream() 메서드는 웹 애플리케이션 내의 정적 파일이나 설정 파일과 같은 리소스에 접근하는 표준화된 방법을 제공한다.
이 인터페이스는 서블릿이나 JSP 내에서 getServletContext() 메서드를 호출하여 얻을 수 있는 객체의 타입이다. 서블릿 컨테이너 벤더(예: 아파치 톰캣, 이클립스 제티)는 이 인터페이스를 구현하여 각자의 방식으로 기능을 제공하지만, 개발자는 인터페이스를 통해 일관된 방식으로 코드를 작성할 수 있어 이식성을 보장받는다. 따라서 ServletContext 인터페이스는 자바 EE 및 자카르타 EE 웹 애플리케이션 개발의 표준적 접근법을 구성하는 중요한 요소이다.
6. 웹 애플리케이션과의 관계
6. 웹 애플리케이션과의 관계
서블릿 컨텍스트는 웹 애플리케이션과 1:1 관계를 가진다. 하나의 웹 애플리케이션이 웹 서버에 배포되면, 해당 애플리케이션을 위한 단 하나의 서블릿 컨텍스트 객체가 생성된다. 이 객체는 애플리케이션이 서버에서 제거되거나 서버가 종료될 때까지 유지되며, 애플리케이션 전체의 생명주기와 동일하게 운용된다.
이 관계는 서블릿 컨텍스트가 애플리케이션 전체를 대표하는 공유 저장소 역할을 가능하게 한다. 애플리케이션 내의 모든 서블릿, 필터, 리스너는 동일한 서블릿 컨텍스트 객체에 접근할 수 있다. 이를 통해 애플리케이션 전반에 걸쳐 공통으로 사용되는 설정 정보, 데이터베이스 연결 풀, 공유 객체 등을 저장하고 관리하는 데 활용된다.
웹 애플리케이션의 구성 요소인 웹 애플리케이션 디렉토리 구조와도 밀접하게 연결되어 있다. 서블릿 컨텍스트는 웹 애플리케이션 루트 디렉토리(/WEB-INF, /WEB-INF/lib, /WEB-INF/classes 등)에 위치한 정적 리소스나 설정 파일에 접근하기 위한 메서드를 제공한다. 이는 애플리케이션의 물리적 구조와 논리적 관리를 연결하는 중요한 다리 역할을 한다.
따라서 서블릿 컨텍스트는 단순한 인터페이스를 넘어, 하나의 웹 애플리케이션을 구성하고 운영하는 데 필요한 전역적 맥락(Context)을 제공하는 핵심 객체이다.
7. ServletConfig와의 차이점
7. ServletConfig와의 차이점
서블릿 컨텍스트와 서블릿 설정은 모두 자바 서블릿 API에서 초기화 정보를 제공하는 객체이지만, 그 범위와 목적에서 근본적인 차이를 보인다. 서블릿 컨텍스트는 전체 웹 애플리케이션을 위한 글로벌한 설정과 상태를 관리하는 반면, 서블릿 설정은 개별 서블릿 인스턴스에 국한된 초기화 정보를 담당한다.
가장 큰 차이는 적용 범위이다. 서블릿 컨텍스트는 웹 애플리케이션 하나당 단 하나만 존재하며, 애플리케이션 내의 모든 서블릿과 JSP가 공유할 수 있는 정보를 저장한다. 반면 서블릿 설정은 각 서블릿마다 별도로 존재하며, 해당 서블릿만 사용할 수 있는 초기화 파라미터를 제공한다. 이는 데이터베이스 연결 문자열과 같은 애플리케이션 전반의 설정은 서블릿 컨텍스트에, 특정 서블릿의 동작을 제어하는 개별적인 매개변수는 서블릿 설정에 저장하는 식으로 구분하여 사용된다.
비교 항목 | ||
|---|---|---|
범위 | 전체 웹 애플리케이션 (글로벌) | 개별 서블릿 (로컬) |
객체 수 | 애플리케이션당 1개 | 서블릿당 1개 |
주요 정보 | 애플리케이션 전체 공유 초기화 파라미터, 애트리뷰트, 리소스 경로 | 특정 서블릿 전용 초기화 파라미터 |
접근 방법 |
|
|
이러한 차이점은 객체를 획득하는 방법에서도 나타난다. 서블릿 컨텍스트는 getServletContext() 메서드를 통해 접근할 수 있고, 서블릿 설정은 서블릿의 init() 메서드에 매개변수로 전달되거나 getServletConfig() 메서드로 얻을 수 있다. 따라서 개발자는 정보의 공유 범위에 따라 두 객체를 적절히 선택하여 사용해야 한다.
8. 사용 예시
8. 사용 예시
서블릿 컨텍스트는 웹 애플리케이션 전역에서 데이터를 공유하거나 리소스에 접근할 때 주로 사용된다. 대표적인 사용 예로는 애플리케이션 전체에 적용되는 설정 정보를 저장하는 경우가 있다. 예를 들어, 데이터베이스 연결 정보나 파일 업로드 경로, 시스템 로그 레벨과 같은 초기화 파라미터를 web.xml 또는 어노테이션을 통해 정의하고, 서블릿 컨텍스트를 통해 모든 서블릿과 JSP 페이지에서 이 정보를 읽어 사용할 수 있다.
또한, 애플리케이션의 상태를 관리하거나 사용자 세션 간에 공유할 데이터를 저장하는 데 활용된다. 웹사이트의 현재 접속자 수를 실시간으로 표시해야 하는 경우, 새로운 세션이 생성될 때마다 서블릿 컨텍스트의 애트리뷰트 값을 증가시키고, 세션이 종료될 때 감소시키는 로직을 구현할 수 있다. 이렇게 저장된 접속자 수는 애플리케이션 내 어떤 페이지에서든 조회하여 표시할 수 있다.
서블릿 컨텍스트는 웹 애플리케이션 루트 디렉토리로부터 상대 경로로 리소스에 접근하는 기능도 제공한다. 이는 웹 애플리케이션이 배포된 실제 파일 시스템 경로에 의존하지 않고, 애플리케이션 내부의 정적 파일(예: 설정 파일, 이미지, 템플릿)을 읽어야 할 때 유용하다. 예를 들어, 모든 페이지에 공통으로 적용되는 HTML 템플릿 파일이나 다국어 지원을 위한 메시지 파일을 로드할 때 이 방법을 사용한다.
마지막으로, 서블릿 컨텍스트는 서로 다른 사용자의 요청을 처리하는 서블릿 간에 통신을 가능하게 하는 매개체 역할도 한다. 한 서블릿이 특정 이벤트의 결과를 서블릿 컨텍스트에 저장하면, 다른 서블릿은 이를 읽어 사용자에게 적절한 응답을 동적으로 구성할 수 있다. 이는 MVC 패턴에서 컨트롤러가 모델 데이터를 뷰에 전달하는 간접적인 경로로 활용되기도 한다.
